package api

import (
	"gauss/internal/model/request"
	"gauss/internal/service"
	"gauss/internal/utils/response"
	"strconv"

	"github.com/gin-gonic/gin"
)

// UserAPI 用户API控制器
type UserAPI struct {
	userService *service.UserService
}

// NewUserAPI 创建用户API控制器
func NewUserAPI() *UserAPI {
	return &UserAPI{
		userService: &service.UserService{},
	}
}

// Login 用户登录
// @Summary      用户登录
// @Description  用户登录并返回JWT token
// @Tags         认证
// @Accept       json
// @Produce      json
// @Param        request body request.LoginRequest true "登录信息"
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /public/login [post]
func (a *UserAPI) Login(c *gin.Context) {
	var req request.LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "请求参数错误")
		return
	}

	token, err := a.userService.Login(&req)
	if err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "登录成功", gin.H{
		"token": token,
	})
}

// Register 用户注册
// @Summary      用户注册
// @Description  创建新用户
// @Tags         认证
// @Accept       json
// @Produce      json
// @Param        request body request.RegisterRequest true "注册信息"
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /public/register [post]
func (a *UserAPI) Register(c *gin.Context) {
	var req request.RegisterRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "请求参数错误")
		return
	}

	if err := a.userService.Register(&req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "注册成功", nil)
}

// GetUserInfo 获取用户信息
// @Summary      获取用户信息
// @Description  获取当前登录用户的详细信息
// @Tags         用户
// @Accept       json
// @Produce      json
// @Security     Bearer
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /users/info [get]
func (a *UserAPI) GetUserInfo(c *gin.Context) {
	userID := c.GetUint("user_id")
	user, err := a.userService.GetUserInfo(userID)
	if err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "获取成功", user)
}

// UpdateUser 更新用户信息
// @Summary      更新用户信息
// @Description  更新当前登录用户的信息
// @Tags         用户
// @Accept       json
// @Produce      json
// @Security     Bearer
// @Param        request body request.UpdateUserRequest true "更新信息"
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /users/info [put]
func (a *UserAPI) UpdateUser(c *gin.Context) {
	var req request.UpdateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "请求参数错误")
		return
	}

	userID := c.GetUint("user_id")
	if err := a.userService.UpdateUser(userID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "更新成功", nil)
}

// UpdatePassword 更新密码
// @Summary      更新密码
// @Description  更新当前登录用户的密码
// @Tags         用户
// @Accept       json
// @Produce      json
// @Security     Bearer
// @Param        request body request.UpdatePasswordRequest true "密码信息"
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /users/password [put]
func (a *UserAPI) UpdatePassword(c *gin.Context) {
	var req request.UpdatePasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "请求参数错误")
		return
	}

	userID := c.GetUint("user_id")
	if err := a.userService.UpdatePassword(userID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "密码更新成功", nil)
}

// ListUsers 获取用户列表
// @Summary      获取用户列表
// @Description  分页获取用户列表
// @Tags         用户
// @Accept       json
// @Produce      json
// @Security     Bearer
// @Param        page query int false "页码" default(1)
// @Param        size query int false "每页数量" default(10)
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /users/list [get]
func (a *UserAPI) ListUsers(c *gin.Context) {
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	size, _ := strconv.Atoi(c.DefaultQuery("size", "10"))

	users, total, err := a.userService.ListUsers(page, size)
	if err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithPage(c, "获取成功", users, total, page, size)
}

// DeleteUser 删除用户
// @Summary      删除用户
// @Description  删除指定用户
// @Tags         用户
// @Accept       json
// @Produce      json
// @Security     Bearer
// @Param        id path int true "用户ID"
// @Success      200  {object}  response.Response
// @Failure      400  {object}  response.Response
// @Router       /users/{id} [delete]
func (a *UserAPI) DeleteUser(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, "无效的用户ID")
		return
	}

	if err := a.userService.DeleteUser(uint(id)); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.Success(c, "删除成功", nil)
}
